import speakeasy from 'speakeasy';
import QRCode from 'qrcode';
import { log } from '../utils/logger.js';

/**
 * Google Authenticator (TOTP) 服务
 */
export class TOTPService {
  /**
   * 生成TOTP密钥
   * @param {string} username 用户名
   * @returns {object} { secret, qrcode }
   */
  static async generateSecret(username) {
    try {
      // 生成密钥
      const secret = speakeasy.generateSecret({
        name: `老薛SSH工具 (${username})`,
        issuer: '老薛SSH工具',
        length: 32
      });

      // 生成二维码
      const qrCodeUrl = await QRCode.toDataURL(secret.otpauth_url);

      log.system('TOTP密钥生成成功', { username });

      return {
        secret: secret.base32,
        qrcode: qrCodeUrl,
        otpauth_url: secret.otpauth_url
      };
    } catch (error) {
      log.error('TOTP密钥生成失败', { error: error.message, username });
      throw error;
    }
  }

  /**
   * 验证TOTP令牌
   * @param {string} secret 密钥
   * @param {string} token 6位验证码
   * @returns {boolean} 是否验证成功
   */
  static verifyToken(secret, token) {
    try {
      const verified = speakeasy.totp.verify({
        secret: secret,
        encoding: 'base32',
        token: token,
        window: 2 // 允许前后2个时间窗口，提高容错性
      });

      if (verified) {
        log.debug('TOTP令牌验证成功');
      } else {
        log.warn('TOTP令牌验证失败');
      }

      return verified;
    } catch (error) {
      log.error('TOTP令牌验证失败', { error: error.message });
      return false;
    }
  }

  /**
   * 生成当前的TOTP令牌（用于测试）
   * @param {string} secret 密钥
   * @returns {string} 6位验证码
   */
  static generateToken(secret) {
    try {
      return speakeasy.totp({
        secret: secret,
        encoding: 'base32'
      });
    } catch (error) {
      log.error('TOTP令牌生成失败', { error: error.message });
      throw error;
    }
  }
}

